﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Retete.Models;
using Retete.ViewModels;
using System.Globalization;
using Retete.Helpers;

namespace Retete.Controllers
{
    public class ReteteController : Controller
    {
        private ReteteEntities entities = new ReteteEntities();

        public ActionResult Index()             // GET: /Retete/
        {
            string categorie = Request["categorie"];
            string nume = Request["nume"];

            var categorii = from element in entities.Retete
                            select element.Categorie;

            var retete = from element in entities.Retete
                         where (string.IsNullOrEmpty(categorie) || element.Categorie == categorie)
                         && (string.IsNullOrEmpty(nume) || element.Nume.Contains(nume))
                         select element;

            return View(new ReteteDeleteViewModel(retete.OrderBy(element => element.Nume).ToList()) { Categorii = categorii.Distinct().ToList(), FiltruCategorie = categorie });
        }
        public ActionResult Create()            // GET: /Retete/Create
        {
            Reteta selectie = entities.Retete.OrderByDescending(element => element.Cod).FirstOrDefault();

            if (selectie == null) return View(new ReteteViewModel() { RetetaNouaMultiplicator = 10 });
            else return View(new ReteteViewModel() { RetetaNouaMultiplicator = 10, CodUltimaReteta = selectie.Cod });
        }
        public ActionResult Edit(int id)        // GET: /Retete/Edit/5
        {
            Reteta selectie = entities.Retete.FirstOrDefault(element => element.ID == id);

            // completez ultimele preturi la produse, conform receptiilor
            foreach (RetetaProdus element in selectie.Produse)
            {
                ReceptieProdus ultimaReceptieProdus = entities.ReceptiiProduse.Where(filtru => filtru.Produs.ID == element.Produs.ID).OrderByDescending(filtru => filtru.Receptie.Data).FirstOrDefault();
                if (ultimaReceptieProdus != null) element.Produs.PretCumparare = ultimaReceptieProdus.PretCumparare / ultimaReceptieProdus.Gramaj;
            }

            if (selectie == null) return RedirectToAction("Index");
            else return View(new ReteteViewModel(selectie));
        }

        [HttpPost]
        public ActionResult Index(ReteteDeleteViewModel result)
        {
            Reteta selectie = entities.Retete.FirstOrDefault(element => element.ID == result.IDRetetaStearsa);

            if (selectie != null)
            {
                try
                {
                    entities.DeleteObject(selectie);
                    entities.SaveChanges();
                    result.IDRetetaStearsa = -1;

                    return RedirectToAction("Index");
                }
                catch
                {
                    ModelState.AddModelError(string.Empty, "Reteta este folosita intr-un meniu (nu poate fi stearsa)");
                    return View(result);
                }
            }
            else if (result.SalveazaPreturi == true)
            {
                foreach (Reteta element in result.Retete) entities.Retete.First(filtru => filtru.ID == element.ID).Pret = element.Pret;

                entities.SaveChanges();
                return View(result);
            }
            else return RedirectToAction("Index", new { categorie = result.FiltruCategorie, nume = result.FiltruNume });
        }

        [HttpPost]
        public ActionResult Create(ReteteViewModel result)           // POST: /Retete/Create
        {
            if (result.RecalculareTotal == true)
            {
                result.RecalculareTotal = false;
                ModelState.Clear();

                return View(result);
            }
            else if (result.IDProdusSters != -1)
            {
                RetetaProdus produsSters = result.Produse.First(element => element.ID == result.IDProdusSters);
                result.Produse.Remove(produsSters);
                result.IDProdusSters = -1;

                ModelState.Clear();
                return View(result);
            }
            else if (string.IsNullOrEmpty(result.ProdusNouNume) == false)
            {
                if (result.ProdusNouCantitate <= 0) ModelState.AddModelError("ProdusNouCantitate", "Cantitatea trebuie sa fie mai mare decat zero");
                if (result.ProdusNouID <= 0) ModelState.AddModelError("ProdusNouNume", "Codul nu este completat");

                if (ModelState.IsValid == true)
                {
                    if (result.Produse == null) result.Produse = new List<RetetaProdus>();

                    Produs selectie = entities.Produse.FirstOrDefault(element => element.ID == result.ProdusNouID);
                    RetetaProdus nou = new RetetaProdus() { IDProdus = result.ProdusNouID, Reteta = new Reteta() { MultiplicatorCantitati = result.RetetaNouaMultiplicator }, Produs = selectie, Cantitate = result.ProdusNouCantitate };
                    ReceptieProdus ultimaReceptieProdus = entities.ReceptiiProduse.Where(filtru => filtru.Produs.ID == selectie.ID).OrderByDescending(filtru => filtru.Receptie.Data).FirstOrDefault();
                    if (ultimaReceptieProdus != null) selectie.PretCumparare = ultimaReceptieProdus.PretCumparareCuTVA / ultimaReceptieProdus.Gramaj;

                    if (result.Produse.Count == 0) nou.ID = 1;
                    else nou.ID = result.Produse.Max(element => element.ID) + 1;

                    result.Produse.Add(nou);
                    result.ProdusNouID = 0;
                    result.ProdusNouNume = string.Empty;
                    result.ProdusNouCantitate = 0;
                    result.FocusProdusNou = true;

                    ModelState.Clear();
                }
                return View(result);
            }
            else
            {
                if (string.IsNullOrEmpty(result.RetetaNouaNume) == true) ModelState.AddModelError("RetetaNouaNume", "Numele retetei este obligatoriu");
                if (string.IsNullOrEmpty(result.RetetaNouaCategorie) == true) ModelState.AddModelError("RetetaNouaCategorie", "Categoria retetei este obligatorie");
                if (string.IsNullOrEmpty(result.RetetaNouaCod) == true) ModelState.AddModelError("RetetaNouaCod", "Codul retetei este obligatoriu");
                if (entities.Retete.Any(element => element.Nume == result.RetetaNouaNume) == true) ModelState.AddModelError("RetetaNouaNume", "Mai exista o reteta cu acelasi nume");
                if (entities.Retete.Any(element => element.Cod == result.RetetaNouaCod) == true) ModelState.AddModelError("RetetaNouaCod", "Mai exista o reteta cu acelasi cod");
                if (string.IsNullOrEmpty(result.RetetaNouaCantitate) == true) ModelState.AddModelError("RetetaNouaCantitate", "Cantitatea retetei este obligatorie");

                if (ModelState.IsValid)
                {
                    Reteta noua = new Reteta() { Cod = result.RetetaNouaCod, Cantitate = result.RetetaNouaCantitate, Nume = result.RetetaNouaNume, Pret = result.RetetaNouaPret, MultiplicatorCantitati = result.RetetaNouaMultiplicator, Categorie = result.RetetaNouaCategorie };
                    if (result.Produse != null) foreach (RetetaProdus element in result.Produse) noua.Produse.Add(new RetetaProdus() { IDProdus = element.IDProdus, Cantitate = element.Cantitate });
                    entities.AddToRetete(noua);

                    entities.SaveChanges();
                    return RedirectToAction("Index");
                }
                else return View(result);
            }
        }

        [HttpPost]
        public ActionResult Edit(int id, ReteteViewModel result)     // POST: /Retete/Edit/5
        {
            if (result.RecalculareTotal == true)
            {
                result.RecalculareTotal = false;
                ModelState.Clear();

                return View(result);
            }
            else  if (result.IDProdusSters != -1)
            {
                RetetaProdus produsSters = result.Produse.First(element => element.ID == result.IDProdusSters);
                result.Produse.Remove(produsSters);
                result.IDProdusSters = -1;

                ModelState.Clear();
                return View(result);
            }
            else if (result.ClonareReteta == true)
            {
                Reteta selectie = entities.Retete.First(element => element.ID == id);
                Reteta clona = new Reteta() { Cantitate = selectie.Cantitate, Categorie = selectie.Categorie, MultiplicatorCantitati = selectie.MultiplicatorCantitati, Nume = selectie.Nume, Pret = selectie.Pret, Cod = selectie.Cod };
                foreach (RetetaProdus element in selectie.Produse) clona.Produse.Add(new RetetaProdus() { Cantitate = element.Cantitate, IDProdus = element.IDProdus });
                entities.AddToRetete(clona);

                clona.Cod = selectie.Cod + " (" + selectie.ID + "!)";
                clona.Nume = selectie.Nume + " (" + selectie.ID + "!)";
                entities.SaveChanges();

                result.ClonareReteta = false;
                ModelState.Clear();
                return RedirectToAction("Index");
            }
            else if (result.TiparireReteta == true)
            {
                return Content(Rapoarte.GenereazaReteta(id));
            }
            else if (string.IsNullOrEmpty(result.ProdusNouNume) == false)
            {
                if (result.ProdusNouCantitate <= 0) ModelState.AddModelError("ProdusNouCantitate", "Cantitatea trebuie sa fie mai mare decat zero");
                if (result.ProdusNouID <= 0) ModelState.AddModelError("ProdusNouNume", "Codul nu este completat");

                if (ModelState.IsValid == true)
                {
                    if (result.Produse == null) result.Produse = new List<RetetaProdus>();

                    Produs selectie = entities.Produse.FirstOrDefault(element => element.ID == result.ProdusNouID);
                    RetetaProdus nou = new RetetaProdus() { IDProdus = result.ProdusNouID, Reteta = result.Reteta, Produs = selectie, Cantitate = result.ProdusNouCantitate };
                    ReceptieProdus ultimaReceptieProdus = entities.ReceptiiProduse.Where(filtru => filtru.Produs.ID == selectie.ID).OrderByDescending(filtru => filtru.Receptie.Data).FirstOrDefault();
                    if (ultimaReceptieProdus != null) selectie.PretCumparare = ultimaReceptieProdus.PretCumparareCuTVA / ultimaReceptieProdus.Gramaj;

                    if (result.Produse.Count == 0) nou.ID = 1;
                    else nou.ID = result.Produse.Max(element => element.ID) + 1;

                    result.Produse.Add(nou);
                    result.ProdusNouID = 0;
                    result.ProdusNouNume = string.Empty;
                    result.ProdusNouCantitate = 0;
                    result.FocusProdusNou = true;

                    ModelState.Clear();
                }
                return View(result);
            }
            else
            {
                if (string.IsNullOrEmpty(result.Reteta.Nume) == true) ModelState.AddModelError("Reteta.Nume", "Numele retetei este obligatoriu");
                if (string.IsNullOrEmpty(result.Reteta.Categorie) == true) ModelState.AddModelError("Reteta.Categorie", "Categoria retetei este obligatorie");
                if (string.IsNullOrEmpty(result.Reteta.Cantitate) == true) ModelState.AddModelError("Reteta.Cantitate", "Cantitatea retetei este obligatorie");

                if (ModelState.IsValid)
                {
                    Reteta selectie = entities.Retete.First(element => element.ID == id);

                    selectie.Nume = result.Reteta.Nume;
                    selectie.Pret = result.Reteta.Pret;
                    selectie.Cod = result.Reteta.Cod;
                    selectie.MultiplicatorCantitati = result.Reteta.MultiplicatorCantitati;
                    selectie.Categorie = result.Reteta.Categorie;
                    selectie.Cantitate = result.Reteta.Cantitate;

                    while (selectie.Produse.Count > 0) entities.DeleteObject(selectie.Produse.First());
                    if (result.Produse != null) foreach (RetetaProdus element in result.Produse) entities.AddToReteteProduse(new RetetaProdus() { IDProdus = element.IDProdus, IDReteta = id, Cantitate = element.Cantitate });

                    try
                    {
                        entities.SaveChanges();
                        return RedirectToAction("Index");
                    }
                    catch
                    {
                        ModelState.AddModelError("Reteta.Nume", "Mai exista o reteta cu acelasi nume");
                        return View(result);
                    }
                }
                else return View(result);
            }
        }
    }
}